package com.blog.cmrpersonalblog.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.blog.cmrpersonalblog.dto.category.response.CategoryManagementResponse;
import com.blog.cmrpersonalblog.dto.category.request.CategoryQueryRequest;
import com.blog.cmrpersonalblog.dto.homepage.HomePageResponse;
import com.blog.cmrpersonalblog.entity.ArticleCategory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 分类管理Mapper接口
 */
@Mapper
public interface CategoryMapper extends BaseMapper<ArticleCategory> {

    /**
     * 分页查询分类管理列表
     * @param page 分页参数
     * @param queryRequest 查询条件
     * @return 分页结果
     */
    IPage<CategoryManagementResponse> selectCategoryManagementPage(Page<CategoryManagementResponse> page, 
                                                                  @Param("request") CategoryQueryRequest queryRequest);

    /**
     * 获取分类详情
     * @param categoryId 分类ID
     * @return 分类详情
     */
    CategoryManagementResponse selectCategoryDetailById(@Param("categoryId") Long categoryId);

    /**
     * 根据名称查询分类（用于重名检查）
     * @param name 分类名称
     * @param excludeId 排除的分类ID（用于更新时检查）
     * @return 分类信息
     */
    ArticleCategory selectCategoryByName(@Param("name") String name, @Param("excludeId") Long excludeId);

    /**
     * 获取首页分类列表（包含文章数量统计）
     * @return 分类列表
     */
    List<HomePageResponse.CategoryInfo> selectHomeCategoryList();

    /**
     * 批量更新分类状态
     * @param categoryIds 分类ID列表
     * @param status 目标状态
     * @return 更新数量
     */
    int batchUpdateCategoryStatus(@Param("categoryIds") List<Long> categoryIds, 
                                 @Param("status") Integer status);

    /**
     * 批量删除分类
     * @param categoryIds 分类ID列表
     * @return 删除数量
     */
    int batchDeleteCategories(@Param("categoryIds") List<Long> categoryIds);

    /**
     * 获取分类统计信息
     * @return 统计信息
     */
    Map<String, Object> selectCategoryStatistics();

    /**
     * 获取分类状态分布
     * @return 状态分布
     */
    List<Map<String, Object>> selectCategoryStatusDistribution();

    /**
     * 获取启用的分类列表（用于下拉选择）
     * @return 启用的分类列表
     */
    List<ArticleCategory> selectEnabledCategories();

    /**
     * 获取分类的文章数量
     * @param categoryId 分类ID
     * @return 文章数量
     */
    Long selectArticleCountByCategoryId(@Param("categoryId") Long categoryId);

    /**
     * 获取分类的已发布文章数量
     * @param categoryId 分类ID
     * @return 已发布文章数量
     */
    Long selectPublishedArticleCountByCategoryId(@Param("categoryId") Long categoryId);

    /**
     * 检查分类是否被文章使用
     * @param categoryId 分类ID
     * @return 是否被使用
     */
    boolean isCategoryUsedByArticles(@Param("categoryId") Long categoryId);

    /**
     * 获取最大排序值
     * @return 最大排序值
     */
    Integer selectMaxSortOrder();

    /**
     * 更新分类排序
     * @param categoryId 分类ID
     * @param sortOrder 新的排序值
     * @return 更新数量
     */
    int updateCategorySortOrder(@Param("categoryId") Long categoryId, @Param("sortOrder") Integer sortOrder);

    /**
     * 获取分类使用情况统计
     * @return 使用情况统计
     */
    List<Map<String, Object>> selectCategoryUsageStatistics();
}
